// 1. 模拟用户状态与权限（实际项目从全局状态/后端获取）
const user = { role: 'user' }; // role: 'user'（普通用户）/ 'admin'（管理员）

// 2. 模拟异步库存查询接口（耗时500ms）
const fetchStock = (goodsId) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      // 模拟不同商品的真实库存
      const stockMap = { 101: 23, 102: 0, 103: 56 };
      resolve(stockMap[goodsId] ?? 0); // 无对应商品返回0
    }, 500);
  });
};

// 3. 库存查询代理（整合缓存代理 + 保护代理）
const stockProxy = (() => {
  const cache = new Map(); // 缓存池：key=goodsId，value={stock, expireTime}

  return async (goodsId) => {
    const now = Date.now();
    const cacheKey = goodsId.toString();

    // 1. 缓存代理：检查缓存是否有效（未过期）
    if (cache.has(cacheKey)) {
      const { stock, expireTime } = cache.get(cacheKey);
      if (now < expireTime) {
        console.log(`[缓存命中] 商品${goodsId}的库存`);
        return formatStock(stock); // 格式化后返回
      }
      cache.delete(cacheKey); // 缓存过期，删除
    }

    // 2. 调用真实接口查询库存
    console.log(`[接口请求] 商品${goodsId}的库存`);
    const realStock = await fetchStock(goodsId);

    // 3. 存储缓存（有效期10秒）
    cache.set(cacheKey, {
      stock: realStock,
      expireTime: now + 10 * 1000 // 10秒后过期
    });

    // 4. 保护代理：按用户权限格式化库存
    return formatStock(realStock);
  };

  // 辅助函数：按权限格式化库存
  function formatStock(realStock) {
    if (user.role === 'admin') {
      return `真实库存：${realStock}件`;
    }
    // 普通用户仅显示“有货/无货”
    return realStock > 0 ? '库存状态：有货' : '库存状态：无货';
  }
})();

// 测试
(async () => {
  // 普通用户查询（首次请求）
  console.log(await stockProxy(101)); // [接口请求] → 库存状态：有货
  // 普通用户重复查询（缓存命中）
  console.log(await stockProxy(101)); // [缓存命中] → 库存状态：有货

  // 切换为管理员
  user.role = 'admin';
  // 管理员查询（缓存未过期）
  console.log(await stockProxy(101)); // [缓存命中] → 真实库存：23件

  // 等待10秒后查询（缓存过期）
  setTimeout(async () => {
    console.log(await stockProxy(101)); // [接口请求] → 真实库存：23件
  }, 10 * 1000);
})();